package cn.tedu.charging.order.rabbitmq.dlx;

import cn.tedu.charging.order.rabbitmq.ChannelManager;
import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import org.junit.Test;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

public class DlxDemo {
    //定义好的死信结构的名称常量
    private static final String BIZ_EX="biz_ex";
    private static final String BIZ_Q="biz_q";
    private static final String DLX_EX="dlx_ex";
    private static final String DLX_Q="dlx_q";
    private static final String DLX_RK="dlx_rk";
    @Test
    public void dlxDeclare() throws Exception {
        //拿到channel
        Channel channel = ChannelManager.createChannel();
        //1.声明业务交换机 fanout
        channel.exchangeDeclare(BIZ_EX, BuiltinExchangeType.FANOUT);
        //2.声明死信交换机 direct
        channel.exchangeDeclare(DLX_EX, BuiltinExchangeType.DIRECT);
        //3.声明业务队列 在属性中定义死信交换机和死信路由
        /*
        durable: 表示队列是否持久化 true 持久化 false 非持久化
        exclusive: 表示队列是否独占 true 独占 false 非独占(创建队列的connection才能操作队列)
        autoDelete: 队列是否自动删除 true 自动删除 false 不自动删除(从第一个消费者连接开始计算,直到最后一个消费者断开连接自动删除)
        arguments: 队列属性特性
         */
        Map<String,Object> args=new HashMap<>();
        //给队列绑定死信交换机
        args.put("x-dead-letter-exchange",DLX_EX);
        //给队列绑定死信路由key
        args.put("x-dead-letter-routing-key",DLX_RK);
        channel.queueDeclare(BIZ_Q,false,false,false,args);
        //4.声明死信队列
        channel.queueDeclare(DLX_Q,false,false,false,null);
        //5.业务队列绑定业务交换机 直接绑
        channel.queueBind(BIZ_Q,BIZ_EX,"");
        //6.死信队列绑定死信交换机
        channel.queueBind(DLX_Q,DLX_EX,DLX_RK);
    }
}
